package com.myapp.db.entity;

import java.nio.ByteBuffer;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.atomic.*;

import com.myapp.data.define.BaseBean;
import com.myapp.db.config.ann.TableDefine;
import com.myapp.db.config.define.UpdateData;
import com.myapp.db.dao.manual.HeroDao;

/**
 * 文件名：HeroEntity.java
 * <p>
 * 功能：
 * <p>
 * 作者：Builded by AppTools.
 */
@TableDefine(name = "Hero", dao = HeroDao.class)
public class HeroEntity extends BaseBean {
	// 用户id
	private AtomicLong userid = new AtomicLong(0);
	
	// 英雄id
	private AtomicLong heroid = new AtomicLong(0);
	
	// 英雄名称
	private String heroname = null;
	
	// 资质
	private AtomicInteger trait = new AtomicInteger(0);
	
	// 类型
	private AtomicInteger type = new AtomicInteger(0);
	
	// 级别
	private AtomicInteger lv = new AtomicInteger(0);
	
	// 经验
	private AtomicLong exp = new AtomicLong(0);
	
	// 智力
	private AtomicInteger wisdom = new AtomicInteger(0);
	
	// 力量
	private AtomicInteger strength = new AtomicInteger(0);
	
	// 内政
	private AtomicInteger economy  = new AtomicInteger(0);
	
	// 入手时间
	private AtomicInteger gettime = new AtomicInteger(0);
	
	// 失去时间（失去一段时间后即真正失去）
	private AtomicInteger losetime = new AtomicInteger(0);
	
	// 此条记录最后修改时间
	private AtomicLong updatetime = new AtomicLong(0);
	

	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getUserid() {
		return this.userid.get();
	}

	/**
	 * 原子增加用户id
	 * 
	 * @param userid 要加的值（正数）
	 */
	public void addUserid(long userid) {
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.addAndGet(userid);
	}

	/**
	 * 原子减少用户id
	 * 
	 * @param userid 要减的值（正数）
	 */
	public void minusUserid(long userid) {
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.addAndGet(userid*-1);
	}
	
	/**
	 * 直接设置userid的值
	 * 
	 * @param userid 要设置的新值
	 */
	public void setUserid(long userid){
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.set(userid);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getHeroid() {
		return this.heroid.get();
	}

	/**
	 * 原子增加英雄id
	 * 
	 * @param heroid 要加的值（正数）
	 */
	public void addHeroid(long heroid) {
		UpdateData data = new UpdateData(this.heroid.get(), heroid);
		this.getOldData().put("heroid", data);
		this.heroid.addAndGet(heroid);
	}

	/**
	 * 原子减少英雄id
	 * 
	 * @param heroid 要减的值（正数）
	 */
	public void minusHeroid(long heroid) {
		UpdateData data = new UpdateData(this.heroid.get(), heroid);
		this.getOldData().put("heroid", data);
		this.heroid.addAndGet(heroid*-1);
	}
	
	/**
	 * 直接设置heroid的值
	 * 
	 * @param heroid 要设置的新值
	 */
	public void setHeroid(long heroid){
		UpdateData data = new UpdateData(this.heroid.get(), heroid);
		this.getOldData().put("heroid", data);
		this.heroid.set(heroid);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public String getHeroname() {
		return this.heroname;
	}

	/**
	 * 直接设置heroname的值
	 * 
	 * @param heroname 要设置的新值
	 */
	public void setHeroname(String heroname) {
		if(this.heroname == null){
			UpdateData data = new UpdateData("", heroname);
			this.getOldData().put("heroname", data);
		}else{
			UpdateData data = new UpdateData(this.heroname, heroname);
			this.getOldData().put("heroname", data);
		}
		this.heroname = heroname;
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getTrait() {
		return trait.get();
	}

	/**
	 * 原子增加资质
	 * 
	 * @param trait 要加的值（正数）
	 */
	public void addTrait(int trait) {
		UpdateData data = new UpdateData(this.trait.get(), trait);
		this.getOldData().put("trait", data);
		this.trait.addAndGet(trait);
	}
	
	/**
	 * 原子减少资质
	 * 
	 * @param trait 要减的值（正数）
	 */
	public void minusTrait(int trait) {
		UpdateData data = new UpdateData(this.trait.get(), trait);
		this.getOldData().put("trait", data);
		this.trait.addAndGet(trait*-1);
	}
	
	/**
	 * 直接设置trait的值
	 * 
	 * @param trait 要设置的新值
	 */
	public void setTrait(int trait){
		UpdateData data = new UpdateData(this.trait.get(), trait);
		this.getOldData().put("trait", data);
		this.trait.set(trait);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getType() {
		return type.get();
	}

	/**
	 * 原子增加类型
	 * 
	 * @param type 要加的值（正数）
	 */
	public void addType(int type) {
		UpdateData data = new UpdateData(this.type.get(), type);
		this.getOldData().put("type", data);
		this.type.addAndGet(type);
	}
	
	/**
	 * 原子减少类型
	 * 
	 * @param type 要减的值（正数）
	 */
	public void minusType(int type) {
		UpdateData data = new UpdateData(this.type.get(), type);
		this.getOldData().put("type", data);
		this.type.addAndGet(type*-1);
	}
	
	/**
	 * 直接设置type的值
	 * 
	 * @param type 要设置的新值
	 */
	public void setType(int type){
		UpdateData data = new UpdateData(this.type.get(), type);
		this.getOldData().put("type", data);
		this.type.set(type);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getLv() {
		return lv.get();
	}

	/**
	 * 原子增加级别
	 * 
	 * @param lv 要加的值（正数）
	 */
	public void addLv(int lv) {
		UpdateData data = new UpdateData(this.lv.get(), lv);
		this.getOldData().put("lv", data);
		this.lv.addAndGet(lv);
	}
	
	/**
	 * 原子减少级别
	 * 
	 * @param lv 要减的值（正数）
	 */
	public void minusLv(int lv) {
		UpdateData data = new UpdateData(this.lv.get(), lv);
		this.getOldData().put("lv", data);
		this.lv.addAndGet(lv*-1);
	}
	
	/**
	 * 直接设置lv的值
	 * 
	 * @param lv 要设置的新值
	 */
	public void setLv(int lv){
		UpdateData data = new UpdateData(this.lv.get(), lv);
		this.getOldData().put("lv", data);
		this.lv.set(lv);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getExp() {
		return this.exp.get();
	}

	/**
	 * 原子增加经验
	 * 
	 * @param exp 要加的值（正数）
	 */
	public void addExp(long exp) {
		UpdateData data = new UpdateData(this.exp.get(), exp);
		this.getOldData().put("exp", data);
		this.exp.addAndGet(exp);
	}

	/**
	 * 原子减少经验
	 * 
	 * @param exp 要减的值（正数）
	 */
	public void minusExp(long exp) {
		UpdateData data = new UpdateData(this.exp.get(), exp);
		this.getOldData().put("exp", data);
		this.exp.addAndGet(exp*-1);
	}
	
	/**
	 * 直接设置exp的值
	 * 
	 * @param exp 要设置的新值
	 */
	public void setExp(long exp){
		UpdateData data = new UpdateData(this.exp.get(), exp);
		this.getOldData().put("exp", data);
		this.exp.set(exp);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getWisdom() {
		return wisdom.get();
	}

	/**
	 * 原子增加智力
	 * 
	 * @param wisdom 要加的值（正数）
	 */
	public void addWisdom(int wisdom) {
		UpdateData data = new UpdateData(this.wisdom.get(), wisdom);
		this.getOldData().put("wisdom", data);
		this.wisdom.addAndGet(wisdom);
	}
	
	/**
	 * 原子减少智力
	 * 
	 * @param wisdom 要减的值（正数）
	 */
	public void minusWisdom(int wisdom) {
		UpdateData data = new UpdateData(this.wisdom.get(), wisdom);
		this.getOldData().put("wisdom", data);
		this.wisdom.addAndGet(wisdom*-1);
	}
	
	/**
	 * 直接设置wisdom的值
	 * 
	 * @param wisdom 要设置的新值
	 */
	public void setWisdom(int wisdom){
		UpdateData data = new UpdateData(this.wisdom.get(), wisdom);
		this.getOldData().put("wisdom", data);
		this.wisdom.set(wisdom);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getStrength() {
		return strength.get();
	}

	/**
	 * 原子增加力量
	 * 
	 * @param strength 要加的值（正数）
	 */
	public void addStrength(int strength) {
		UpdateData data = new UpdateData(this.strength.get(), strength);
		this.getOldData().put("strength", data);
		this.strength.addAndGet(strength);
	}
	
	/**
	 * 原子减少力量
	 * 
	 * @param strength 要减的值（正数）
	 */
	public void minusStrength(int strength) {
		UpdateData data = new UpdateData(this.strength.get(), strength);
		this.getOldData().put("strength", data);
		this.strength.addAndGet(strength*-1);
	}
	
	/**
	 * 直接设置strength的值
	 * 
	 * @param strength 要设置的新值
	 */
	public void setStrength(int strength){
		UpdateData data = new UpdateData(this.strength.get(), strength);
		this.getOldData().put("strength", data);
		this.strength.set(strength);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getEconomy () {
		return economy .get();
	}

	/**
	 * 原子增加内政
	 * 
	 * @param economy  要加的值（正数）
	 */
	public void addEconomy (int economy ) {
		UpdateData data = new UpdateData(this.economy .get(), economy );
		this.getOldData().put("economy ", data);
		this.economy .addAndGet(economy );
	}
	
	/**
	 * 原子减少内政
	 * 
	 * @param economy  要减的值（正数）
	 */
	public void minusEconomy (int economy ) {
		UpdateData data = new UpdateData(this.economy .get(), economy );
		this.getOldData().put("economy ", data);
		this.economy .addAndGet(economy *-1);
	}
	
	/**
	 * 直接设置economy 的值
	 * 
	 * @param economy  要设置的新值
	 */
	public void setEconomy (int economy ){
		UpdateData data = new UpdateData(this.economy .get(), economy );
		this.getOldData().put("economy ", data);
		this.economy .set(economy );
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getGettime() {
		return gettime.get();
	}

	/**
	 * 原子增加入手时间
	 * 
	 * @param gettime 要加的值（正数）
	 */
	public void addGettime(int gettime) {
		UpdateData data = new UpdateData(this.gettime.get(), gettime);
		this.getOldData().put("gettime", data);
		this.gettime.addAndGet(gettime);
	}
	
	/**
	 * 原子减少入手时间
	 * 
	 * @param gettime 要减的值（正数）
	 */
	public void minusGettime(int gettime) {
		UpdateData data = new UpdateData(this.gettime.get(), gettime);
		this.getOldData().put("gettime", data);
		this.gettime.addAndGet(gettime*-1);
	}
	
	/**
	 * 直接设置gettime的值
	 * 
	 * @param gettime 要设置的新值
	 */
	public void setGettime(int gettime){
		UpdateData data = new UpdateData(this.gettime.get(), gettime);
		this.getOldData().put("gettime", data);
		this.gettime.set(gettime);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getLosetime() {
		return losetime.get();
	}

	/**
	 * 原子增加失去时间（失去一段时间后即真正失去）
	 * 
	 * @param losetime 要加的值（正数）
	 */
	public void addLosetime(int losetime) {
		UpdateData data = new UpdateData(this.losetime.get(), losetime);
		this.getOldData().put("losetime", data);
		this.losetime.addAndGet(losetime);
	}
	
	/**
	 * 原子减少失去时间（失去一段时间后即真正失去）
	 * 
	 * @param losetime 要减的值（正数）
	 */
	public void minusLosetime(int losetime) {
		UpdateData data = new UpdateData(this.losetime.get(), losetime);
		this.getOldData().put("losetime", data);
		this.losetime.addAndGet(losetime*-1);
	}
	
	/**
	 * 直接设置losetime的值
	 * 
	 * @param losetime 要设置的新值
	 */
	public void setLosetime(int losetime){
		UpdateData data = new UpdateData(this.losetime.get(), losetime);
		this.getOldData().put("losetime", data);
		this.losetime.set(losetime);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getUpdatetime() {
		return this.updatetime.get();
	}

	/**
	 * 原子增加此条记录最后修改时间
	 * 
	 * @param updatetime 要加的值（正数）
	 */
	public void addUpdatetime(long updatetime) {
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.addAndGet(updatetime);
	}

	/**
	 * 原子减少此条记录最后修改时间
	 * 
	 * @param updatetime 要减的值（正数）
	 */
	public void minusUpdatetime(long updatetime) {
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.addAndGet(updatetime*-1);
	}
	
	/**
	 * 直接设置updatetime的值
	 * 
	 * @param updatetime 要设置的新值
	 */
	public void setUpdatetime(long updatetime){
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.set(updatetime);
	}
	

	@Override
	public void parseEntity(ResultSet rest) throws SQLException {
		// id
		this.setId(rest.getLong(1));
		// 用户id
		this.userid.set(rest.getLong(2));
		// 英雄id
		this.heroid.set(rest.getLong(3));
		// 英雄名称
		String tmp = rest.getString(4);
		if (!"null".equals(tmp)) {
			this.heroname = tmp;
		}
		// 资质
		this.trait.set(rest.getInt(5));
		// 类型
		this.type.set(rest.getInt(6));
		// 级别
		this.lv.set(rest.getInt(7));
		// 经验
		this.exp.set(rest.getLong(8));
		// 智力
		this.wisdom.set(rest.getInt(9));
		// 力量
		this.strength.set(rest.getInt(10));
		// 内政
		this.economy .set(rest.getInt(11));
		// 入手时间
		this.gettime.set(rest.getInt(12));
		// 失去时间（失去一段时间后即真正失去）
		this.losetime.set(rest.getInt(13));
		// 此条记录最后修改时间
		this.updatetime.set(rest.getLong(14));
	}
	
	
	/**
	 * 将本对象变化的数据序列化
	 * 
	 * @return 返回序列化后的数据
	 */
	@Override
	public byte[] serialization() {
	ByteBuffer data = ByteBuffer.allocate(1024);
		if (this.getOldData().containsKey("userid")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 0);
			data.putLong(userid.get());
		}
		if (this.getOldData().containsKey("heroid")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 1);
			data.putLong(heroid.get());
		}
		if (this.getOldData().containsKey("heroname")) {
			byte[] tmp=heroname.getBytes();
			data = this.checkCapacity(data, tmp.length);
			data.put((byte) 2);
			data.putInt(tmp.length);
			data.put(tmp);
		}
		if (this.getOldData().containsKey("trait")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 3);
			data.putInt(trait.get());
		}
		if (this.getOldData().containsKey("type")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 4);
			data.putInt(type.get());
		}
		if (this.getOldData().containsKey("lv")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 5);
			data.putInt(lv.get());
		}
		if (this.getOldData().containsKey("exp")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 6);
			data.putLong(exp.get());
		}
		if (this.getOldData().containsKey("wisdom")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 7);
			data.putInt(wisdom.get());
		}
		if (this.getOldData().containsKey("strength")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 8);
			data.putInt(strength.get());
		}
		if (this.getOldData().containsKey("economy ")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 9);
			data.putInt(economy .get());
		}
		if (this.getOldData().containsKey("gettime")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 10);
			data.putInt(gettime.get());
		}
		if (this.getOldData().containsKey("losetime")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 11);
			data.putInt(losetime.get());
		}
		if (this.getOldData().containsKey("updatetime")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 12);
			data.putLong(updatetime.get());
		}
		data.flip();
		return data.array();
	}
	
	
	/**
	 * 反序列化
	 * 
	 * @param data 要反序列化的数据
	 * 
	 * @return 返回序列化出来的对象
	 */
	@SuppressWarnings("unchecked")
	@Override
	public HeroEntity unSerialization(byte[] data) {
		HeroEntity heroEntity = new HeroEntity();
		if (data.length > 0) {

			ByteBuffer buffer = ByteBuffer.wrap(data);
			buffer.flip();

			byte type = 0;
			while (buffer.position() < buffer.limit()) {
				type = buffer.get();
			if (type ==  0) {
				this.setUserid(buffer.getLong());
			}
			
			if (type ==  1) {
				this.setHeroid(buffer.getLong());
			}
			
			if (type ==  2) {
				int length=buffer.getInt();
				byte[] tmp=new byte[length];
				buffer.get(tmp);
				this.setHeroname(new String(tmp));
			}
			
			if (type ==  3) {
				this.setTrait(buffer.getInt());
			}
			
			if (type ==  4) {
				this.setType(buffer.getInt());
			}
			
			if (type ==  5) {
				this.setLv(buffer.getInt());
			}
			
			if (type ==  6) {
				this.setExp(buffer.getLong());
			}
			
			if (type ==  7) {
				this.setWisdom(buffer.getInt());
			}
			
			if (type ==  8) {
				this.setStrength(buffer.getInt());
			}
			
			if (type ==  9) {
				this.setEconomy (buffer.getInt());
			}
			
			if (type ==  10) {
				this.setGettime(buffer.getInt());
			}
			
			if (type ==  11) {
				this.setLosetime(buffer.getInt());
			}
			
			if (type ==  12) {
				this.setUpdatetime(buffer.getLong());
			}
			
			}
		}

		return heroEntity;
	}
}
